﻿#ifndef PROJECTTREEDATA_H
#define PROJECTTREEDATA_H

#include <QString>
#include <QObject>
#include <QSharedPointer>
#include <QList>
#include <QTreeView>
#include <QStandardItem>
#include "API_DataManager.h"
#include "BaseModule/GlobalEnums.h"

namespace DataManager
{
    class ProjectTreeDataManager;
}
#define ProjectTreeDataInstance DataManager::ProjectTreeData::getInstance()
namespace DataManager
{
    class API_DATAMANAGER ProjectTreeData : public QObject
    {
        Q_OBJECT
    public:
        static ProjectTreeData* getInstance();

        void setTreeView(QTreeView* treeView);
        /// @brief 生成项目树节点的最大ID
        /// @return 节点最大ID
        int generateProjectTreeItemID();

        /// @brief 设置工程树节点ID（全部重新设置）
        void setProjectTreeAllItemID();

        /// @brief 通过ID获取项目树节点数据
        /// @param ID
        /// @return
        QStandardItem* getProjectTreeItemByID(const int ID);

        /// @brief 获取当前节点数据
        /// @return
        int getCurrentQStandardItemID();
        QStandardItem* getCurrentQStandardItem();


        /// @brief 添加粘贴节点和导入节点数据
        /// @param srcID 粘贴的源节点ID，导入节点的源节点为-1
        /// @param dstID 粘贴的目标节点ID，导入节点的ID
        /// @param importItemFilePath 导入节点的文件路径
        void appendPasteAndImportItemData(int srcID, int dstID, QString importItemFilePath);

        void removePasteAndImportItemData(int dstID);

        /// @brief 获取导入数据产生的节点ID和文件路径
        /// @return 
        QList<QPair<int, QString>> getImportItemDataList();

        // 根据ID排序
        void sort();
        // 清空全部数据
        void clear();
        //-----------以下与项目保存相关---------------
        /// @brief 读取配置数据
        void readConfig();

        /// @brief 保存配置数据
        void writeConfig();

        /// @brief 重置数据，新建项目时需要清空原来数据
        void resetData();

        /// @brief 将数据添加到字节数组中
        /// @param byteArray 字节数组
        void dataToByteArray(QByteArray* byteArray);
        //-----------以上与项目保存相关---------------

    private:
        ProjectTreeData() = default;
        ~ProjectTreeData();

        /// @brief 遍历所有节点设置ID
        /// @param item 项目树根节点
        void traverseItemSetID(QStandardItem* item);

        /// @brief 遍历项目树获取节点通过ID
        /// @param item 传入的根节点
        /// @param ID
        /// @return 选中的节点
        QStandardItem* traverseGetItemByID(QStandardItem* item, int ID);
        /// @brief 重置项目树节点ID最大值 慎用
        void resetProjectTreeItemMaxID();

    private:
        static ProjectTreeData* m_instance;
        int m_projectTreeItemMaxID{0};
        QTreeView* m_treeView;

        /// @brief 复制粘贴和导入的节点数据<源节点ID，目标节点ID>，导入的节点的源节点ID为-1，考虑复制粘贴和导入的顺序使用此list
        QList<QPair<int, int>> m_pasteAndImportItemData;
        /// @brief 导入数据产生的节点ID和文件路径
        QList<QPair<int, QString>> m_importItemDataList;

        bool m_isSavaProject{false};
        /// @brief 节点的父节点ID，根节点的父节点ID为-1，只有保存打开项目会用到
        QList<int> m_itemParentIDList;
        /// @brief 节点自己的ID，只有保存打开项目会用到
        QList<int> m_itemOwnIDList;
        /// @brief item的名称，只有保存打开项目会用到
        QList<QString> m_itemNameList;
        /// @brief 配置文件中数据
        QSharedPointer<DataManager::ProjectTreeDataManager> m_configData;
    };
} // namespace DataManager

#endif
